import xlrd
import json
import os
from utils.handle_yaml import get_yml_data


def get_excel_data(sheet_name, case_name, run_case=None, env='test', host_type=None):
    # 读取excel配置数据
    # excel_conf = get_yml_data('../config/excelConfig.yml')

    """
        从 Excel 文件读取指定测试用例数据
        """
    # 获取项目根目录
    base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    excel_conf_path = os.path.join(base_dir, 'config', 'excelConfig.yml')

    # 读取配置
    excel_conf = get_yml_data(excel_conf_path)
    if not excel_conf:
        raise FileNotFoundError(f"无法读取 YAML 文件: {excel_conf_path}")
    if 'file_name' not in excel_conf:
        raise KeyError(f"'file_name' 在 {excel_conf_path} 中不存在，请检查配置")

    # 根据host_type设置不同的配置路径或其他逻辑
    if host_type:
        print(f"使用 {host_type} 配置")
        # 这里可以根据 host_type 来调整配置加载方式

    # file_path = os.path.join('../data', excel_conf["file_name"])
    base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 项目根目录
    file_path = os.path.join(base_dir, 'data', excel_conf["file_name"])
    col_key = f'col_{env}'  # 根据环境选择对应的列名
    args = excel_conf[col_key]  # 获取对应环境下的列名

    res_list = []  # 存放最终结果
    # 打开Excel文件
    try:
        wk = xlrd.open_workbook(file_path, formatting_info=True)
        wk_sheet = wk.sheet_by_name(sheet_name)  # sheet名字
    except Exception as e:
        print(f"无法打开 Excel 文件: {e}")
        return res_list

    # 获取列编号
    col_index_list = [wk_sheet.row_values(0).index(col_name) for col_name in args]
    print("需要获取的测试用例列编号是：", col_index_list)

    # 用例筛选
    run_case_list = get_run_case_list(run_case, case_name)
    print('需要运行的测试用例是：', run_case_list)

    # 获取每行数据
    for row_index in range(1, wk_sheet.nrows):  # 跳过标题行
        case_id = wk_sheet.cell_value(row_index, 0)
        if case_name in case_id and case_id in run_case_list:
            col_data = [is_json(wk_sheet.cell(row_index, num).value) for num in col_index_list]
            res_list.append(tuple(col_data))

    print(res_list)
    return res_list


def get_run_case_list(run_case, case_name):
    """生成需要执行的用例列表"""
    run_case_list = []
    if run_case is None or 'all' in run_case:
        run_case_list = [f'{case_name}-{str(i).zfill(3)}' for i in range(1, 1000)]  # 只考虑最大1000个用例
    else:
        for i in run_case:
            if '-' in i:
                start, end = map(int, i.split('-'))
                run_case_list.extend([f'{case_name}-{str(num).zfill(3)}' for num in range(start, end + 1)])
            else:
                run_case_list.append(f'{case_name}-{str(i).zfill(3)}')
    return run_case_list


def is_json(data):
    """
    判断是否是 JSON 字符串，如果是则返回字典，如果不是则返回原始数据
    :param data: 需要检查的数据
    :return: 字典或原始数据
    """
    try:
        return json.loads(data) if isinstance(data, str) else data
    except json.JSONDecodeError:
        return data


if __name__ == '__main__':
    res = get_excel_data(sheet_name='下单流程', case_name='order_create', run_case=['001'], env='test', host_type='v2_url')
